package junior.Recursion递归;

/**
 * 对数字进行全排列，与对任意 不重复元素进行全排列
 * 等价于对元素的下标，即连续值，进行全排列（下标与元素一一对应的结果）
 */
public class 全排列_递归交换_解析 {
    static int left;  //左
    static int right;  //右
    static int[] a= {1,2,3};
    static int sums=0;
    public static void main(String[] args) {
        long t1 = System.currentTimeMillis();
        perm(a,0,a.length-1);
        System.out.println("全排列个数为："+sums);
        long t2 = System.currentTimeMillis();
        System.out.println("时间："+(t2-t1));

    }
    static public void perm(int[] a,int left,int right){  //核心思想：递归的方式，对数组元素进行交换
        if(left == right){                                //        可以保留现场，回到现场时，数组还是当前的状态
            sums++;
            show(a); // 函数什么也不执行，相当于return
        }
        else {
            for (int i = left; i <= right; i++) {  //i从p开始循环
                swap(a,left,i);
                perm(a,left+1,right);
                swap(a,left,i);
            }
        }
    }
    static void show(int[] a){
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+" ");
        }
        System.out.println();
    }
    static void swap(int[] a,int i,int j){ //数组引用类型
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }

}
